其他
glibc字符编码研究
我们经常遇到的ASCII、unicode、Big5、GB2312、GBK等等都属于编码系统,他们都包含两方面的内容:字符集和编码方案。
字符集是编码系统收录的图形符号集合,比如ASCII码收录了现代英语字母的图形,GB2312收录了常用汉字图形。
编码方案是图形和数字之间的映射关系,使得用数字代替图形便于计算机输入输出,比如在ASCII码中,0~31及127共33个是控制字符或通信专用字符,32~126共95个是可显示字符。
unicode:"\xca\x4e"
UTF-16: "\xca\x4e"
UTF-32: "\x00\x00\xca\x4e"
UTF-8: "\xe4\xbb\x8a"
/*
* demo1.c UTF-8
*/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <locale.h>
char *name1 = "今天";
wchar_t *name2 = L"今天";
int main(){
printf("%s\n", name1);
printf("%s\n", name2);
return 0;
}
拖到UE里面查看,可以看到都是单字节的UTF-8编码,特别注意方框内标记的是“今”的UTF-8编码。
再将demo1.c转化为UTF-16小端编码,可以看到被扩展为2字节,文件的size也变大了!
其中开头的“\xFF\xFE”是UTF-16小端编码文件的magic,“\xCA\x4E”是汉字“今”的UTF-16编码。
可见源代码文件是采用了特定的编码系统来存储程序员写的代码,在Windows平台下的visual studio采用的是ANSI编码,Linux下的源码文件通常为UTF-8编码。
这里再次可以见到采用UTF-8对英文字符的unicode进行编码可以节约文件占用的空间!
之所以强调英文字符,是因为如果采用UTF-8对其他字符比如汉字进行编码反而不占优势。
编译器对源码文件的编码方式是有要求的,例如gcc要求源码文件必须是UTF-8编码,而Windows下的MSVC则支持多种编码方式的源文件并且需要在MSVC的编译选项中加以指定。
1、char类型字符的表示
2、wchar_t类型字符的表示
1、原生编码
2、UCS-4编码
/**demo1.c UTF-8**/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <locale.h>
wchar_t buf[10];
int main(){
setlocale(LC_ALL, "zh_CN.UTF-8");
scanf("%ls", buf);
return 0;
}
/** demo2.c UTF-8 **/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <locale.h>
char *name1 = "今天";
wchar_t *name2 = L"今天";
int main(){
printf("before setlocale: %ls\n", name2);
setlocale(LC_ALL, "zh_CN.UTF-8");
printf("after setlocale: %ls\n", name2);
return 0;
}
输出函数格式化串少加了一个"l"引发的错误
/** demo3.c UTF-8 **/
#include <wchar.h>
#include <unistd.h>
#include <stdio.h>
#include <locale.h>
char *name1 = "中文";
wchar_t *name2 = L"中文"; //UCS-4
int main(){
setlocale(LC_ALL, "zh_CN.UTF-8");
wprintf(L"%s\n", name2);
return 0;
}
输入函数格式化串少了"l"引发的错误
/*
* demo4.c UTF-8
*/
#include <wchar.h>
#include <unistd.h>
#include <stdio.h>
#include <locale.h>
char buf[10];
int main(){
setlocale(LC_ALL, "zh_CN.UTF-8");
scanf("%s", buf);
wprintf(L"buffer: %ls\n", buf);
return 0;
}
看雪ID:极目楚天舒
https://bbs.pediy.com/user-741085.htm
推荐文章++++
好书推荐